package com.itheima.project.face;

import com.itheima.project.exception.ProjectException;
import com.itheima.project.vo.search.RequestParamVo;
import com.itheima.project.vo.search.SearchPageVo;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author mrchen
 * @date 2022/3/5 17:39
 */
public interface DocumentFace {
    /**
     * 保存对象到索引库
     * @param doc  根据class中的EsIndex注解 判断索引库名称
     * @param <T>
     * @throws ProjectException
     */
    <T> void save(T doc) throws ProjectException;
    /**
     * 保存对象到索引库
     * @param doc  指定索引库名称
     * @param indexName
     * @throws ProjectException
     */
    void save(Map doc, String indexName) throws ProjectException;
    /**
     * 批量保存数据到所辛苦
     * @param list  要保存的数据集合
     * @param indexName  索引库名称
     * @throws ProjectException
     */
    void saveBatch(List<Map> list,String indexName) throws ProjectException;
    /**
     * 根据ID删除索引库数据
     * @param id
     */
    void deleteById(Object id,String indexName);
    /**
     * 根据ID获取索引库数据
     * @param id
     * @return
     */
    <T> T getById(Object id,String indexName);
    /**
     * 搜索数据
     * @param paramVo 所有搜索条件
     * @param tClass 根据esIndex注解，判断索引库
     * @return 原生返回结果
     */
    SearchResponse search(RequestParamVo paramVo, Class<?> tClass);
    /**
     * 搜索数据
     * @param paramVo 所有搜索条件
     * @param indexName  根据指定索引库名称
     * @return 原生返回结果
     */
    SearchPageVo<Object> search(RequestParamVo paramVo, String indexName);
    /**
     * 搜索数据
     * @param searchContent 所有搜索条件
     * @param indexName  根据指定索引库名称
     * @return 封装后的分页返回结果
     */
    SearchPageVo<Object> search(String searchContent, String indexName) throws IOException;
    /**
     * 搜索数据
     * @param searchContent 所有搜索条件
     * @param indexName  根据指定索引库名称
     * @return 原生返回结果
     */
    String searchNativeResult(String searchContent, String indexName) throws IOException;
}
